package com.zh.flowable.support;

import com.zh.mycommon.util.MyIdGenerator;
import org.jetbrains.annotations.NotNull;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 审批号生成器
 */
public class AutoFlowNoGenerator {
    static final Map<String, String> last = new ConcurrentHashMap<>(4);

    /**
     * 审批号生成
     *
     * @param processDefinitionKey
     * @return 审批号
     */
    public synchronized static String autoFlowNo(@NotNull String processDefinitionKey) {
        //将编号前缀生成逻辑提取为 单一职责的方法
        var prefix = getPrefix(processDefinitionKey); //注意会全局共享

        while (true) {
            var autoNo = prefix + MyIdGenerator.idByTimestamp();

            if (!Objects.equals(autoNo, last.get(prefix))) {
                last.put(prefix, autoNo);
                return autoNo;
            }
        }
    }

    // 审批号前缀。可以把prefix缓存，但是为了简单直接去生成
    public static String getPrefix(@NotNull String processDefinitionKey) {
        var prefix = "";

        var split = processDefinitionKey.split("_");
        if (split.length == 1) {
            prefix = split[0].substring(0, 2);
        } else {
            prefix = getFirstChar(split[0]) + "" + getFirstChar(split[1]);
        }
        return prefix.toUpperCase();
    }

    //安全获取字符串的第一个字符，如果字符串为空则返回默认字符
    static char getFirstChar(@NotNull String str) {
        return str.isEmpty() ? '-' : str.charAt(0);
    }

}
